module RailsCurrency
  class Convertor
    class Google

      CURRENCIES = {
        'AED' => 'United Arab Emirates Dirham (AED)',
        'AFN' => 'Afghan Afghani (AFN)',
        'ALL' => 'Albanian Lek (ALL)',
        'AMD' => 'Armenian Dram (AMD)',
        'ANG' => 'Netherlands Antillean Guilder (ANG)',
        'AOA' => 'Angolan Kwanza (AOA)',
        'ARS' => 'Argentine Peso (ARS)',
        'AUD' => 'Australian Dollar (A$)',
        'AWG' => 'Aruban Florin (AWG)',
        'AZN' => 'Azerbaijani Manat (AZN)',
        'BAM' => 'Bosnia-Herzegovina Convertible Mark (BAM)',
        'BBD' => 'Barbadian Dollar (BBD)',
        'BDT' => 'Bangladeshi Taka (BDT)',
        'BGN' => 'Bulgarian Lev (BGN)',
        'BHD' => 'Bahraini Dinar (BHD)',
        'BIF' => 'Burundian Franc (BIF)',
        'BMD' => 'Bermudan Dollar (BMD)',
        'BND' => 'Brunei Dollar (BND)',
        'BOB' => 'Bolivian Boliviano (BOB)',
        'BRL' => 'Brazilian Real (R$)',
        'BSD' => 'Bahamian Dollar (BSD)',
        'BTC' => 'Bitcoin (฿)',
        'BTN' => 'Bhutanese Ngultrum (BTN)',
        'BWP' => 'Botswanan Pula (BWP)',
        'BYR' => 'Belarusian Ruble (BYR)',
        'BZD' => 'Belize Dollar (BZD)',
        'CAD' => 'Canadian Dollar (CA$)',
        'CDF' => 'Congolese Franc (CDF)',
        'CHF' => 'Swiss Franc (CHF)',
        'CLF' => 'Chilean Unit of Account (UF) (CLF)',
        'CLP' => 'Chilean Peso (CLP)',
        'CNH' => 'CNH (CNH)',
        'CNY' => 'Chinese Yuan (CN¥)',
        'COP' => 'Colombian Peso (COP)',
        'CRC' => 'Costa Rican Colón (CRC)',
        'CUP' => 'Cuban Peso (CUP)',
        'CVE' => 'Cape Verdean Escudo (CVE)',
        'CZK' => 'Czech Republic Koruna (CZK)',
        'DEM' => 'German Mark (DEM)',
        'DJF' => 'Djiboutian Franc (DJF)',
        'DKK' => 'Danish Krone (DKK)',
        'DOP' => 'Dominican Peso (DOP)',
        'DZD' => 'Algerian Dinar (DZD)',
        'EGP' => 'Egyptian Pound (EGP)',
        'ERN' => 'Eritrean Nakfa (ERN)',
        'ETB' => 'Ethiopian Birr (ETB)',
        'EUR' => 'Euro (€)',
        'FIM' => 'Finnish Markka (FIM)',
        'FJD' => 'Fijian Dollar (FJD)',
        'FKP' => 'Falkland Islands Pound (FKP)',
        'FRF' => 'French Franc (FRF)',
        'GBP' => 'British Pound Sterling (£)',
        'GEL' => 'Georgian Lari (GEL)',
        'GHS' => 'Ghanaian Cedi (GHS)',
        'GIP' => 'Gibraltar Pound (GIP)',
        'GMD' => 'Gambian Dalasi (GMD)',
        'GNF' => 'Guinean Franc (GNF)',
        'GTQ' => 'Guatemalan Quetzal (GTQ)',
        'GYD' => 'Guyanaese Dollar (GYD)',
        'HKD' => 'Hong Kong Dollar (HK$)',
        'HNL' => 'Honduran Lempira (HNL)',
        'HRK' => 'Croatian Kuna (HRK)',
        'HTG' => 'Haitian Gourde (HTG)',
        'HUF' => 'Hungarian Forint (HUF)',
        'IDR' => 'Indonesian Rupiah (IDR)',
        'IEP' => 'Irish Pound (IEP)',
        'ILS' => 'Israeli New Sheqel (₪)',
        'INR' => 'Indian Rupee (Rs.)',
        'IQD' => 'Iraqi Dinar (IQD)',
        'IRR' => 'Iranian Rial (IRR)',
        'ISK' => 'Icelandic Króna (ISK)',
        'ITL' => 'Italian Lira (ITL)',
        'JMD' => 'Jamaican Dollar (JMD)',
        'JOD' => 'Jordanian Dinar (JOD)',
        'JPY' => 'Japanese Yen (¥)',
        'KES' => 'Kenyan Shilling (KES)',
        'KGS' => 'Kyrgystani Som (KGS)',
        'KHR' => 'Cambodian Riel (KHR)',
        'KMF' => 'Comorian Franc (KMF)',
        'KPW' => 'North Korean Won (KPW)',
        'KRW' => 'South Korean Won (₩)',
        'KWD' => 'Kuwaiti Dinar (KWD)',
        'KYD' => 'Cayman Islands Dollar (KYD)',
        'KZT' => 'Kazakhstani Tenge (KZT)',
        'LAK' => 'Laotian Kip (LAK)',
        'LBP' => 'Lebanese Pound (LBP)',
        'LKR' => 'Sri Lankan Rupee (LKR)',
        'LRD' => 'Liberian Dollar (LRD)',
        'LSL' => 'Lesotho Loti (LSL)',
        'LTL' => 'Lithuanian Litas (LTL)',
        'LVL' => 'Latvian Lats (LVL)',
        'LYD' => 'Libyan Dinar (LYD)',
        'MAD' => 'Moroccan Dirham (MAD)',
        'MDL' => 'Moldovan Leu (MDL)',
        'MGA' => 'Malagasy Ariary (MGA)',
        'MKD' => 'Macedonian Denar (MKD)',
        'MMK' => 'Myanmar Kyat (MMK)',
        'MNT' => 'Mongolian Tugrik (MNT)',
        'MOP' => 'Macanese Pataca (MOP)',
        'MRO' => 'Mauritanian Ouguiya (MRO)',
        'MUR' => 'Mauritian Rupee (MUR)',
        'MVR' => 'Maldivian Rufiyaa (MVR)',
        'MWK' => 'Malawian Kwacha (MWK)',
        'MXN' => 'Mexican Peso (MX$)',
        'MYR' => 'Malaysian Ringgit (MYR)',
        'MZN' => 'Mozambican Metical (MZN)',
        'NAD' => 'Namibian Dollar (NAD)',
        'NGN' => 'Nigerian Naira (NGN)',
        'NIO' => 'Nicaraguan Córdoba (NIO)',
        'NOK' => 'Norwegian Krone (NOK)',
        'NPR' => 'Nepalese Rupee (NPR)',
        'NZD' => 'New Zealand Dollar (NZ$)',
        'OMR' => 'Omani Rial (OMR)',
        'PAB' => 'Panamanian Balboa (PAB)',
        'PEN' => 'Peruvian Nuevo Sol (PEN)',
        'PGK' => 'Papua New Guinean Kina (PGK)',
        'PHP' => 'Philippine Peso (Php)',
        'PKG' => 'PKG (PKG)',
        'PKR' => 'Pakistani Rupee (PKR)',
        'PLN' => 'Polish Zloty (PLN)',
        'PYG' => 'Paraguayan Guarani (PYG)',
        'QAR' => 'Qatari Rial (QAR)',
        'RON' => 'Romanian Leu (RON)',
        'RSD' => 'Serbian Dinar (RSD)',
        'RUB' => 'Russian Ruble (RUB)',
        'RWF' => 'Rwandan Franc (RWF)',
        'SAR' => 'Saudi Riyal (SAR)',
        'SBD' => 'Solomon Islands Dollar (SBD)',
        'SCR' => 'Seychellois Rupee (SCR)',
        'SDG' => 'Sudanese Pound (SDG)',
        'SEK' => 'Swedish Krona (SEK)',
        'SGD' => 'Singapore Dollar (SGD)',
        'SHP' => 'Saint Helena Pound (SHP)',
        'SLL' => 'Sierra Leonean Leone (SLL)',
        'SOS' => 'Somali Shilling (SOS)',
        'SRD' => 'Surinamese Dollar (SRD)',
        'STD' => 'São Tomé and Príncipe Dobra (STD)',
        'SVC' => 'Salvadoran Colón (SVC)',
        'SYP' => 'Syrian Pound (SYP)',
        'SZL' => 'Swazi Lilangeni (SZL)',
        'THB' => 'Thai Baht (฿)',
        'TJS' => 'Tajikistani Somoni (TJS)',
        'TMT' => 'Turkmenistani Manat (TMT)',
        'TND' => 'Tunisian Dinar (TND)',
        'TOP' => 'Tongan Paʻanga (TOP)',
        'TRY' => 'Turkish Lira (TRY)',
        'TTD' => 'Trinidad and Tobago Dollar (TTD)',
        'TWD' => 'New Taiwan Dollar (NT$)',
        'TZS' => 'Tanzanian Shilling (TZS)',
        'UAH' => 'Ukrainian Hryvnia (UAH)',
        'UGX' => 'Ugandan Shilling (UGX)',
        'USD' => 'US Dollar ($)',
        'UYU' => 'Uruguayan Peso (UYU)',
        'UZS' => 'Uzbekistan Som (UZS)',
        'VEF' => 'Venezuelan Bolívar (VEF)',
        'VND' => 'Vietnamese Dong (₫)',
        'VUV' => 'Vanuatu Vatu (VUV)',
        'WST' => 'Samoan Tala (WST)',
        'XAF' => 'CFA Franc BEAC (FCFA)',
        'XCD' => 'East Caribbean Dollar (EC$)',
        'XDR' => 'Special Drawing Rights (XDR)',
        'XOF' => 'CFA Franc BCEAO (CFA)',
        'XPF' => 'CFP Franc (CFPF)',
        'YER' => 'Yemeni Rial (YER)',
        'ZAR' => 'South African Rand (ZAR)',
        'ZMK' => 'Zambian Kwacha (1968-2012) (ZMK)',
        'ZMW' => 'Zambian Kwacha (ZMW)',
        'ZWL' => 'Zimbabwean Dollar (2009) (ZWL)'
      }
      class << self

        def service_url
          'http://www.google.com/finance/converter'
        end

        def convert(amount, from, to)
          Convertor.convert(amount, from, to, 'google')
        end

        def process_request(amount, from, to)
          url = "#{service_url}?a=#{amount}&from=#{from}&to=#{to}"
          doc = open(url, Convertor::PARAMS) { |f| Hpricot(f) }
          result = doc.search("//span[@class='bld']").inner_html.split(' ').first.to_f
        end

        def get_rate(from, to)
          convert(1, from, to)
        end

      end

    end
  end
end
